package com.cy.ppj.service.product;

import com.cy.ppj.model.PageBean;
import com.cy.ppj.model.Result;
import com.cy.ppj.model.ao.product.ProductAddAO;
import com.cy.ppj.model.ao.product.ProductEditAO;
import com.cy.ppj.model.enums.Process;
import com.cy.ppj.model.enums.ProductAttachmentType;
import com.cy.ppj.model.enums.ProductStatus;
import com.cy.ppj.model.enums.RecommendType;
import com.cy.ppj.model.query.ProductAdminQuery;
import com.cy.ppj.model.query.ProductQuery;
import com.cy.ppj.model.query.ProductRecommendAdminQuery;
import com.cy.ppj.model.query.RecommendedProductsAdminQuery;
import com.cy.ppj.model.domian.product.Product;
import com.cy.ppj.model.domian.product.ProductRate;
import com.cy.ppj.model.domian.product.ProductType;
import com.cy.ppj.model.vo.ProductAdminVO;
import com.cy.ppj.model.vo.ProductDetailVO;
import com.cy.ppj.model.vo.ProductExtendPathVO;
import com.cy.ppj.model.vo.ProductRecommendAdminVO;
import com.cy.ppj.model.vo.ProductVO;
import com.cy.ppj.model.vo.RecommendedProductsAdminVO;

import java.util.List;


/**
 * 产品业务
 */
public interface ProductService {

    /**
     * 新增产品
     * @param productaddAO
     */
    void addProduct(ProductAddAO productaddAO);

    /**
     * 新增产品类型
     * @param name
     */
    void addType(String name);

    /**
     * 编辑产品类型
     * @param productType
     */
    void updateType(ProductType productType);

    /**
     * 所有产品类型,有缓存
     * @return
     */
    List<ProductType> allTypesInCache();

    /**
     * 编辑产品
     * @param productEditAO
     */
    void updateProduct(ProductEditAO productEditAO);

    /**
     * 获取产品流程缓存
     * @param productId
     * @return
     */
    List<Process> getProcessByProductIdInCache(Long productId);

    /**
     * 后台产品列表
     * @param productAdminQuery
     * @return
     */
    PageBean<ProductAdminVO> adminProducts(ProductAdminQuery productAdminQuery);
    
    /**
     * 前台首页产品列表
     * @param productQuery
     * @return
     */
    PageBean<ProductVO> homeProducts(ProductQuery productQuery);
    
    /**
     * 前端根据产品id查询产品详细信息
     * @param productId
     * @return
     */
    ProductDetailVO queryProductDetail(Long productId, Long userId);
    
    /**
     * 前台产品列表，并分页
     * @param productQuery
     * @return
     */
    PageBean<ProductVO> queryProductList(ProductQuery productQuery);
    
    /**
     * 后台查询产品详情信息
     * @param productId
     * @return
     */
    Result queryProductDetailAdmin(Long productId);
    
    /**
     * 更改产品状态
     * @param productId
     * @param productStatus
     * @return
     */
    Result updateProductStatus(Long productId, ProductStatus productStatus);
    
    /**
     * 添加产品推荐列表
     * @param productId
     * @param type
     */
    void addProductRecommend(Long productId, RecommendType type);
    
    /**
     * 后台产品推荐列表分页
     * @param productRecommendAdminQuery
     * @return
     */
    PageBean<ProductRecommendAdminVO> queryProductRecommendAdminList(ProductRecommendAdminQuery productRecommendAdminQuery);
    
    /**
     * 根据订单查询相应的产品的关联的期限列表
     * @param orderId
     * @return
     */
    Result queryPeriodsByOrderId(Long orderId);
    
    /**
     * 通过产品ID，附件类型，查找附件地址
     * @param productId
     * @param type
     * @return
     */
    ProductExtendPathVO selectPathByProductIdAndType(Long productId, ProductAttachmentType type);
    
    /**
     * 查找产品实体信息
     * @param product
     * @return
     */
    Product selectProduct(Product product);

    /**
     * 通过产品推荐的主键ID删除数据
     * @param id
     */
	void deleteProductRecommendById(Long id);
	
	/**
	 * 查询可推荐的产品列表
	 * 
	 * @param query
	 * @return
	 */
	PageBean<RecommendedProductsAdminVO> selectRecommendedProductsAdminList(RecommendedProductsAdminQuery query);
	
	/**
	 * 全部上架产品列表，有缓存
	 * 
	 * @return
	 */
	List<Product> selectAllProductsIncache();
	
	/**
	 * 通过 productId 查询产品期限、利率、还款方式
	 * 
	 * @param productId
	 * @return
	 */
	List<ProductRate> selectProductRateListByProductId(Long productId);
	
	/**
	 * 后台录单可选择的产品
	 * 
	 * @return
	 */
	List<Product> selectProductsForAddOrderInCache();
}
